package com.mifan.utils;/*
 * @Author Milan
 * @Date 2024/9/13 18:16
 */

import com.alibaba.fastjson.JSON;
import com.mifan.entity.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtTokenUtil {

    // 密钥
    private static final String SECRET_KEY = "hmPoxrXLd6!!";

    // 过期时间（1天，单位：毫秒）
    private static final long EXPIRATION_TIME = 86400000;

    // 生成 JWT 令牌  传入整个 user 信息
    public static String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
//        String userJson = JSON.toJSONString(user);
        claims.put("username", username);
        return createToken(claims, username);
    }

    // 创建 JWT 令牌
    private static String createToken(Map<String, Object> claims, String subject) {
        return Jwts.builder()
                .setClaims(claims) // 设置声明
                .setSubject(subject) // 设置主题
                .setIssuedAt(new Date(System.currentTimeMillis())) // 设置签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 设置签名算法和密钥
                .compact();
    }

    // 验证 JWT 令牌
    public static Boolean validateToken(String token) {
        final String extractedUsername = extractUsername(token);
        return (extractedUsername != null && !isTokenExpired(token));
    }

    // 从 JWT 令牌中提取用户名
    public static String extractUsername(String token) {
        return extractAllClaims(token).getSubject();
    }

    // 提取所有声明
    private static Claims extractAllClaims(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY) // 设置签名密钥
                .parseClaimsJws(token) // 解析令牌
                .getBody();
    }

    // 检查令牌是否过期
    private static Boolean isTokenExpired(String token) {
        return extractAllClaims(token).getExpiration().before(new Date());
    }

    // 从 JWT 令牌中提取用户信息
    // 从 JWT 令牌中提取用户信息
    public static String extractUser(String token) {
        Claims claims = extractAllClaims(token);
        String username = claims.get("username", String.class);
        return username;
    }
}